/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package facade;

import authentification.Exception.AuthException;
import authentification.entitie.UserAuth;
import entities.Proposition;
import entities.question.AbstractQuestion;
import entities.questionnaire.Apparence;
import entities.questionnaire.Questionnaire;
import entities.utilisateur.AbstractRepondant;
import entities.utilisateur.AbstractUtilisateur;
import entities.utilisateur.Createur;
import entities.utilisateur.RepondantAuthentifie;
import entities.utilisateur.Valideur;
import java.util.List;
import javax.ejb.Local;
import javax.persistence.EntityExistsException;

/**
 * Cette interface représente les methodes nécessaire à l'execution de l interface graphique.
 * 
 * @author aurelien.emery
 */
@Local
public interface AdministrationFacadeLocal {



    /**
     * Cette methode permet d'neregistrer le questionnaire passé en parametre.
     * @param questionnaire
     * @throws EntityExistsException si le questionnaire existe deja
     */
    public void createQuestionnaire(Questionnaire questionnaire);

    /**
     * Cette methode permet de creer la question passée en parametre
     * @param question
     * @throws EntityExistsException si la question existe deja
     */
    public void createQuestion(AbstractQuestion question);

    /**
     * Cette methode permet de creer la proposition passée en parametre
     * @param proposition
     * @throws EntityExistsException si la proposition existe deja
     */
    public void createProposition(Proposition proposition);

    /**
     * Cette methode permet d 'enregistrer les modifications apporté au questionnaire passé en parametre
     * @param question
     * @throws IllegalArgumentException si la question n existe pas ou a ete supprimé du contexte de persistence
     */
    public void editQuestionnaire(Questionnaire questionnaire);

    /**
     * Cette methode permet d 'enregistrer les modifications apporté à la question passée en parametre
     * @param question
     * @throws IllegalArgumentException si la question n existe pas ou a ete supprimé du contexte de persistence
     */
    public void editQuestion(AbstractQuestion question);

    /**
     * Renvoie la qusetion correspondant a l identifiant passé en parametre
     * @param id
     * @return la question ou null si pas de question correspondant a l id
     */
    public AbstractQuestion findQuestion(Long id);

    /**
     * Renvoie l apparence correspondant a l id
     * @param id
     * @return l apparence ou null si pas d apparence correspondant a l id
     */
    public Apparence findApparence(Long id);

    /**
     * Renvoie la proposition correspondant a l id
     * @param id
     * @return la proposition ou null si pas de proposition correspondant a l id
     */
    public Proposition findProposition(Long id);

    /**
     * Renvoie le questionnaire correspondant a l id
     * @param id
     * @return le questionnaire ou null si pas de questionnaire correspondant a l id
     */
    public Questionnaire findQuestionnaire(Long id);


    /**
     * Renvoie l utilisateur correspondant a l id
     * @param id
     * @return l utilisateur ou null si pas d utilisateur correspondant a l id
     */
    public AbstractUtilisateur findUtilisateur(Long id);

    /**
     * Renvoie l utilisateur correspondant a un login
     * @param login
     * @return l utilisateur ou null si pas d utilisateur correspondant au login
     */
    public Createur findCreateur(String login);


    /**
     * Renvoie une liste de toutes les apparences
     * @return l ensemble des apparences
     */
    public List<Apparence> findAllApparence();

    /**
     * Renvoie une liste de toutes les propositions
     * @return l ensemble des propositions
     */
    public List<Proposition> findAllProposition();

    /**
     * Renvoie une liste de toutes les questions
     * @return l ensemble des questions
     *
     */
    public List<AbstractQuestion> findAllQuestion();

    /**
     * Renvoie une liste de tous les questionnaires
     * @return l ensemble des qusetionnaires
     */
    public List<Questionnaire> findAllQuestionnaire();

    /**
     * Renvoie une liste de questionnaires d'une plage
     * @return l ensemble des questionnaires entre 2 bornes
     */
    public List<Questionnaire> findQuestionnaireRange(int[] range);

    /**
     * Renvoie une liste de tous les questionnaires dispo
     * @param utilisateur en cours
     * @return l ensemble des qusetionnaires
     */
    public List<Questionnaire> findAllQuestionnaireDispo(AbstractRepondant repondant);

    /**
     * Renvoie une liste de questionnaires dispo d'une plage
     * @param utilisateur en cours
     * @return l ensemble des questionnaires entre 2 bornes
     */
    public List<Questionnaire> findQuestionnaireDispoRange(AbstractRepondant repondant, int[] range);

    /**
     * Renvoie une liste de tous les utilisateurs
     * @return l ensemble des utilisateurs
     */
    public List<AbstractUtilisateur> findAllUtilisateur();

    /**
     * Renvoie une liste de tous les répondants
     * @return l ensemble des répondants
     */
    public List<RepondantAuthentifie> findAllRepondant();

    /**
     * Renvoie une liste de tous les créateurs
     * @return l ensemble des créateurs
     */
    public List<Createur> findAllCreateur();


    /**
     * Renvoie le nombre d'occurences
     * @return le nomdre d'enregistrements total
     */
    public int countQuestionnaire();

    /**
     * Renvoie le nombre d'occurences
     * @return le nomdre d'enregistrements total
     */
    public int countQuestion();

    /**
     * Renvoie le nombre de personnes ayant répondu à un questionnaire
     * @param l'objet questionnaire devant avoir des réponses
     * @return le nomdre de répondants effectif au questionnaire
     */
    public long countRepondant(Questionnaire questionnaire);

    /**
     * Permet de valider un questionnaire
     * @param q
     * @param v
     */
    public void valider(Questionnaire q, Valideur v);

    /**
     * Permet de récupérer d'id du dernier questionnaire enregistré
     * @return l'id du dernier questionnaire de la base
     */
    public long getLastIdQuestionnaire();

    /**
     * Permet de récupérer d'id de la dernière question enregistrée
     * @return l'id de la dernière question de la base
     */
    public long getLastIdQuestion();

    /**
     * Permet de diffuser un questionnaire passé en paramètre
     * @param questionnaire à diffuser
     */
    public void diffuser(Questionnaire q);

    /**
     * Permet de relancer la diffusion du questionnaire passé en paramètre
     * aux personnes n'ayant pas encore répondu
     * @param questionnaire à relancer
     */
    public void relancerDiffusion(Questionnaire q);

    /**
     * Permet de valider un couple login / mdp
     * @param login
     * @param mot de passe
     * @return l'utilisateur correspondant
     */
    public UserAuth validerUser(String login, String mdp) throws AuthException;
}
